package com.work.chat.common.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectUtils {
    
    /**
     * 获取对象的字段值
     * @param obj 对象
     * @param fieldName 字段名
     * @return 字段值
     */
    public static Object getFieldValue(Object obj, String fieldName) {
        try {
            Field field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            return field.get(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 设置对象的字段值
     * @param obj 对象
     * @param fieldName 字段名
     * @param value 新的字段值
     */
    public static void setFieldValue(Object obj, String fieldName, Object value) {
        try {
            Field field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(obj, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 调用对象的方法
     * @param obj 对象
     * @param methodName 方法名
     * @param args 方法参数
     * @return 方法返回值
     */
    public static Object invokeMethod(Object obj, String methodName, Object... args) {
        try {
            Class<?>[] parameterTypes = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                parameterTypes[i] = args[i].getClass();
            }
            Method method = obj.getClass().getMethod(methodName, parameterTypes);
            return method.invoke(obj, args);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 创建对象实例
     * @param className 类名
     * @param args 构造函数参数
     * @return 对象实例
     */
    public static Object createInstance(String className, Object... args) {
        try {
            Class<?>[] parameterTypes = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                parameterTypes[i] = args[i].getClass();
            }
            Class<?> cls = Class.forName(className);
            return cls.getConstructor(parameterTypes).newInstance(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
